package ratelimit

import (
	"context"
	"errors"
	"webook/internal/service/sms"
	"webook/pkg/ratelimit"
)

// RateLimitSmsService 装饰器模式装饰短信服务
type RateLimitSmsService struct {
	svc     sms.Service
	limiter ratelimit.RateLimiter
}

func NewService(svc sms.Service, limiter ratelimit.RateLimiter) *RateLimitSmsService {
	return &RateLimitSmsService{
		svc:     svc,
		limiter: limiter,
	}
}

func (s *RateLimitSmsService) Send(ctx context.Context, phone string, templateCode string, templateParam string) error {
	// 限流逻辑
	limited, err := s.limiter.Limit(ctx, "sms:send:"+phone)
	if err != nil {
		// 此处限流报错，还要不要限流？
		// 如果下游比较强悍可以不限流
		// 如果下游比较瘦弱可以限流
		return err
	}
	if limited {
		return errors.New("触发限流")
	}
	// 短信服务实现
	return s.svc.Send(ctx, phone, templateCode, templateParam)
}
